/**
 * Clase que Simula un banco
 * @author Diego Enriquez 10038
 */
public class Banco {
	private Cola[] colas;
	private ListaOrdenada eventos;
	private int tActual;
	private int cant;

	/**
	 * Genera un nuevo banco
	 */
	public Banco(){
		cant = 0;
		colas = new Cola[4];
		for (int c = 0; c < 4; c++){
			colas[c] = new Cola();
		}
		eventos = new ListaOrdenada();
		tActual = 0;
	}
	/**
	 * Metodo que determina que cola del banco es mas corta
	 * @return devuelve el numero de la cola mas corta
	 */
	public int colaMasCorta(){
		int masCorta=0;
		if (!(colas[masCorta].size() <= colas[0].size()))
			masCorta = 0;
		if (!(colas[masCorta].size() <= colas[1].size()))
			masCorta = 1;	
		if (!(colas[masCorta].size() <= colas[2].size()))
			masCorta = 2;	
		if (!(colas[masCorta].size() <= colas[3].size()))
			masCorta = 3;			
		return masCorta;
	}
	
	/**
	 * Metodo que crea los eventos de entrada y salida y los realiza
	 * @param clientes los clientes que entraran en el banco
	 */
	public void abrir(Cliente[] clientes){
		for(Cliente c : clientes)
			eventos.add(new Evento(c.getT1(), c));
		cant = eventos.size();
		while(!eventos.isEmpty()){
			Evento evento = eventos.removeFirst();
			tActual = evento.getTiempo();
			Evento salida = evento.accion(colas[colaMasCorta()], tActual);
			if (salida!=null){
				eventos.add(salida);
			}
		}
	}
	
	/**
	 * Metodo que calcula el promedio general de los clientes del banco
	 * @return devuelve el promedio
	 */
	public double promedio(){
		double prom=0;
		for(Cola c : colas){
			prom += c.promedio();
		}
		prom = prom/cant;
		return prom;
	}
	
	/**
	 * Metodo que permite obtener el tiempo actual
	 * @return el tiempo actual
	 */
	public int getTActual(){
		return tActual;
	}

}
